package com.rybbaby.tss.tasks.core.utils;

import java.util.List;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * @author 谢进伟
 * @description json处理工具
 * @createDate 2016年2月15日 上午9:11:56
 */
public class JSONUtil {

	private static ObjectMapper om = new ObjectMapper();

	/**
	 * 将一个对象格式化成json串
	 *
	 * @param obj 需要格式化的对象
	 * @return
	 * @throws JsonProcessingException
	 */
	public static String toJsonStr(Object obj) throws JsonProcessingException {
		return om.writeValueAsString(obj);
	}

	/**
	 * 将一个json串转换成一个pojo对象
	 *
	 * @param jsonStr json串
	 * @param cls     pojo类型
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T> T jsonToBean(String jsonStr, Class<T> cls) {
		try {
			JSONObject jsonObject = JSONObject.fromObject(jsonStr);
			Object obj = JSONObject.toBean(jsonObject, cls);
			return (T)obj;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * json 转集合
	 *
	 * @param jsonString json字符串
	 * @param classT     类型
	 * @return
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 */
	public static <T> List<T> jsonToList(String jsonString, Class<T> classT) throws InstantiationException, IllegalAccessException {
		JsonConfig jsonConfig = new JsonConfig();
		return toList(jsonString, classT, jsonConfig);
	}

	/**
	 * json 转集合
	 *
	 * @param jsonString json字符串
	 * @param classMap   类型映射
	 * @param classT     类型
	 * @return
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 */
	public static <T> List<T> jsonToList(String jsonString, Map<String, Class<?>> classMap, Class<T> classT) throws InstantiationException, IllegalAccessException {
		JsonConfig jsonConfig = new JsonConfig();
		jsonConfig.setClassMap(classMap);
		return toList(jsonString, classT, jsonConfig);
	}

	/**
	 * 从net.sf.json.JSONObject取出指定key的值
	 *
	 * @param json         sjon对象
	 * @param key          需要取出值的key
	 * @param defaultValue 当不存在指定key时返回的默认值,不允许传入null作为默认值
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getJsonVale(JSONObject json, String key, T defaultValue) {
		Object returnValue = defaultValue;
		if(json != null && json.containsKey(key)) {
			Class<? extends Object> returnCls = null;
			if(defaultValue != null) {
				returnCls = defaultValue.getClass();
			} else {
				returnCls = json.get(key).getClass();
			}
			switch(returnCls.getSimpleName()){
				case "Integer":
					returnValue = json.getInt(key);
					break;
				case "String":
					returnValue = json.getString(key);
					break;
				case "Boolean":
					returnValue = json.getBoolean(key);
					break;
				case "Double":
					returnValue = json.getDouble(key);
					break;
				case "Long":
					returnValue = json.getLong(key);
					break;
			}
		}
		if(returnValue != null) {
			return (T)returnValue;
		} else {
			return defaultValue;
		}
	}

	@SuppressWarnings("unchecked")
	private static <T> List<T> toList(String jsonString, Class<T> classT, JsonConfig jsonConfig) throws InstantiationException, IllegalAccessException {
		JSONArray jsonArray = JSONArray.fromObject(jsonString);
		return JSONArray.toList(jsonArray, classT.newInstance(), jsonConfig);
	}
}